package van.planifolia.worddemo;

/**
 * Created by Intellij IDEA<br>
 *
 * @author Planifolia.Van
 * @version 1.0
 * @date 2022/11/1 18:30
 */
public class AlternateAccess {
    public static void main(String[] args) {
        // 创建银行实体
        Bank bank = new Bank();
        // 创建线程模拟存10次钱
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    bank.save();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"小明").start();
        // 创建线程模拟取10次钱
        new Thread(()->{
            for (int i = 0; i < 10; i++) {
                try {
                    bank.take();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        },"小红").start();
    }
}

/**
 * 这个代表银行账户
 */
class Bank {
    private int money = 0;

    /**
     * 取钱同步方法，并且每次取1000
     */
    public synchronized void take() throws InterruptedException {
        // 当余额小于等于0的时候当前线程通知其他线程存钱，然后等待被其他线程唤醒
        if (money <= 0) {
            notify();
            System.out.println(Thread.currentThread().getName()+"在等待其他人存钱");
        }
        wait();
        // 当被唤醒之后就执行取钱业务减去1000元
        money = money - 1000;
        System.out.println(Thread.currentThread().getName() + "取走了1000元，还剩下" + money);
        // 取走之后通知存钱
        notify();
    }
    /**
     * 存钱同步方法，每次存1000元
     */
    public synchronized void save() throws InterruptedException {
        // 当金额大于0通知其他线程来取钱，并且等待其他线程唤醒
        if (money > 0) {
            notify();
            System.out.println(Thread.currentThread().getName()+"在等待其他人取钱");
        }
        wait();
        // 被唤醒了就执行业务增加1000元
        money = money + 1000;
        System.out.println(Thread.currentThread().getName() + "存入了1000元，还剩下" + money);
        // 存完之后通知取钱
        notify();
    }
}
